﻿using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.IO;
using System.Linq;

namespace DataConnectors
{
	/// <summary>
	/// Общий коннектор к БД.
	/// </summary>
	public class GeneralDataConnector
	{
		private static SqlConnection _connection;
		private const string DefaultConnectionString = @"";

		/// <summary>
		/// SQL соединение.
		/// </summary>
		public static SqlConnection Connection
		{
			get
			{
				if (_connection == null)
					_connection = new SqlConnection(DefaultConnectionString);
				if (_connection.State != ConnectionState.Open)
					_connection.Open();
				return _connection;
			}
		}

		/// <summary>
		/// Выполнение хранимой процедуры с получением результата.
		/// </summary>
		/// <param name="procedureName">Название процедуры</param>
		/// <param name="param">Параметры процедуры.</param>
		/// <returns>Возвращаемая таблица результатов.</returns>
		public DataTable Execute(string procedureName, Dictionary<string, object> param)
		{
			var result = new DataTable();
			var command = new SqlCommand(procedureName, Connection);

			// Загрузка параметров.
			if (param != null)
			{
				command.CommandType = CommandType.StoredProcedure;
				foreach (var par in param.Select(s => new SqlParameter(s.Key, s.Value)))
				{
					command.Parameters.Add(par);
				}
			}

			var reader = command.ExecuteReader();
			for (var i = 0; i < reader.FieldCount; i++)
				result.Columns.Add(reader.GetName(i));

			// Чтение результата.
			while (reader.Read())
			{
				var row = result.NewRow();
				for (var i = 0; i < reader.FieldCount; i++)
				{
					if(reader.GetFieldType(i) == typeof(byte[]))
					{
						var bytes =  reader.GetSqlBinary(i).Value;
						row[reader.GetName(i)] = new MemoryStream(bytes);
					}
					else
					{
						row[reader.GetName(i)] = reader.GetValue(i);
					}
				}

				result.Rows.Add(row);
			}
			reader.Close();
			return result;
		}
	}	
}
